/**
 * 
 */
package com.cuc.platform.core.componet.security.dao;

import java.util.List;
import java.util.Map;

import com.cuc.platform.core.componet.security.domain.SecurityAuthority;
import com.cuc.platform.core.componet.security.domain.SecurityMenu;
import com.cuc.platform.core.componet.security.domain.SecurityResource;
import com.cuc.platform.core.componet.security.domain.SecurityRole;
import com.cuc.platform.core.componet.security.domain.SecurityUser;

/**
 * @author peepul
 * 安全模块复合查询Dao接口
 *
 * 其他Dao通过用Mybatis的MapperFactoryBean做代理。
 * 
 * 组合查询涉及到条件拼接，且与业务关系不大，集中一个模块统一处理比较合适。
 * 不设service层，web层可绕过service层，直接调用。
 * 
 * 注：传入到map的key为实体对象的属性，不是数据库字段名
 */
public interface SecurityComplexQueryDao {
	
	/**
	 * 基于Mybatis的jdbc 数据库分页技术查询
	 * 
	 * @param map 查询参数
	 * @param offset 位置偏移量，从0开始计算
	 * @param limit  每页的记录数
	 * 
	 * @return List
	 */
	public List<SecurityUser> queryUsersWithPage(Map<String, Object> map, int offset, int limit);
	
	/**
	 * 账号信息复合查询
	 * 
	 * 可拼接的条件有：
	 * 				username：账号名称
	 * 				aliasname：用户姓名
	 * 				   status：账号状态
	 * 
	 * @param map： key为属性名，value为条件具体值
	 *
	 * @return List<SecurityUser>
	 */
	public List<SecurityUser> queryUsers(Map<String, Object> map);
	
	/**
	 * 角色信息复合查询
	 * 
	 * 可拼接的条件有：
	 * 				name：角色名称
	 * 
	 * @param map： key为属性名，value为条件具体值
	 *
	 * @return List<SecurityRole>
	 */
	public List<SecurityRole> queryRoles(Map<String, String> map);
	
	/**
	 * 权限信息复合查询
	 * 
	 * 可拼接的条件有：
	 * 				name：权限名称
	 * 
	 * @param map： key为属性名，value为条件具体值
	 *
	 * @return List<SecurityAuthority>
	 */
	public List<SecurityAuthority> queryAuths(Map<String, String> map);
	
	/**
	 * 资源的查询方法
	 * 
	 * @param map 
	 *          条件map，key为属性名，value为条件具体值
	 * 			其中可以拼接的条件key：name, res_type, res_string
	 * 
	 * @return List<SecurityResource>
	 */
	public List<SecurityResource> queryRescs(Map<String, String> map);
	
	/**
	 * 菜单信息复合查询
	 * 
	 * 可拼接的条件有：
	 * 				name：菜单名称
	 * 				menuUrl：菜单url
	 * 				parentId：父菜单
	 * 				level：层次级别
	 * 				code：菜单编码
	 * 
	 * @param map： key为属性名，value为条件具体值
	 *
	 * @return List<SecurityMenu>
	 */
	public List<SecurityMenu> queryMenus(Map<String, Object> map);
}
